using System;
using System.Collections.Generic;

namespace demo001.Config
{
    /// <summary>
    /// API配置类，集中管理所有API路由和控制器
    /// 提供了一个统一的地方来管理和维护所有API端点
    /// 包含了认证、用户、视频、版本等各个模块的API配置
    /// </summary>
    public static class ApiConfig
    {
        /// <summary>
        /// API服务器的基础URL
        /// 可以根据不同环境（开发、测试、生产）进行配置
        /// </summary>
        public static string BaseUrl { get; set; } = "http://192.168.3.62:8081";

        /// <summary>
        /// 认证相关API配置
        /// 包含登录、注册、令牌刷新等认证相关的端点
        /// </summary>
        public static class Auth
        {
            /// <summary>
            /// 用户登录API端点
            /// 用于处理用户的登录请求
            /// </summary>
            public static ApiEndpoint Login => new ApiEndpoint
            {
                Url = "/api/auth/login",
                Method = HttpMethod.Post,
                Description = "用户登录"
            };

            /// <summary>
            /// 用户注册API端点
            /// 用于处理新用户的注册请求
            /// </summary>
            public static ApiEndpoint Register => new ApiEndpoint
            {
                Url = "/api/auth/register",
                Method = HttpMethod.Post,
                Description = "用户注册"
            };

            /// <summary>
            /// 刷新访问令牌API端点
            /// 用于刷新过期的访问令牌
            /// </summary>
            public static ApiEndpoint RefreshToken => new ApiEndpoint
            {
                Url = "/api/auth/refresh",
                Method = HttpMethod.Post,
                Description = "刷新访问令牌"
            };
        }

        /// <summary>
        /// 用户相关API配置
        /// 包含用户信息管理相关的端点
        /// </summary>
        public static class User
        {
            /// <summary>
            /// 获取用户信息API端点
            /// 用于获取当前登录用户的详细信息
            /// 需要认证才能访问
            /// </summary>
            public static ApiEndpoint Profile => new ApiEndpoint
            {
                Url = "/api/user/profile",
                Method = HttpMethod.Get,
                Description = "获取用户信息",
                RequiresAuth = true
            };
        }

        /// <summary>
        /// 视频相关API配置
        /// 包含视频的搜索、获取详情、下载等功能
        /// </summary>
        public static class Video
        {
            /// <summary>
            /// 视频搜索API端点
            /// 用于搜索视频内容
            /// 需要认证才能访问
            /// </summary>
            public static ApiEndpoint Search => new ApiEndpoint
            {
                Url = "/api/videos/search",
                Method = HttpMethod.Get,
                Description = "搜索视频",
                RequiresAuth = true
            };

            /// <summary>
            /// 获取视频详情API端点
            /// 用于获取特定视频的详细信息
            /// 需要认证才能访问
            /// </summary>
            public static ApiEndpoint GetVideo => new ApiEndpoint
            {
                Url = "/api/videos/{id}",
                Method = HttpMethod.Get,
                Description = "获取视频详情",
                RequiresAuth = true
            };

            /// <summary>
            /// 视频下载API端点
            /// 用于下载特定的视频文件
            /// 需要认证才能访问
            /// </summary>
            public static ApiEndpoint DownloadVideo => new ApiEndpoint
            {
                Url = "/api/videos/{id}/download",
                Method = HttpMethod.Get,
                Description = "下载视频",
                RequiresAuth = true
            };
        }

        /// <summary>
        /// 版本相关API配置
        /// 包含应用程序版本管理相关的端点
        /// </summary>
        public static class Version
        {
            /// <summary>
            /// 检查更新API端点
            /// 用于检查应用程序是否有新版本
            /// </summary>
            public static ApiEndpoint CheckUpdate => new ApiEndpoint
            {
                Url = "/api/version/check-update",
                Method = HttpMethod.Get,
                Description = "检查应用更新"
            };
        }

        /// <summary>
        /// 管理员相关API配置
        /// 包含管理员特有的管理功能端点
        /// </summary>
        public static class Admin
        {
            /// <summary>
            /// 获取用户列表API端点
            /// 用于管理员查看所有用户信息
            /// 需要管理员权限
            /// </summary>
            public static ApiEndpoint Users => new ApiEndpoint
            {
                Url = "/api/admin/users",
                Method = HttpMethod.Get,
                Description = "管理员获取用户列表",
                RequiresAuth = true,
                RequiresAdmin = true
            };

            /// <summary>
            /// 管理特定用户API端点
            /// 用于管理员管理单个用户
            /// 需要管理员权限
            /// </summary>
            public static ApiEndpoint User => new ApiEndpoint
            {
                Url = "/api/admin/user/{id}",
                Method = HttpMethod.Get,
                Description = "管理员管理特定用户",
                RequiresAuth = true,
                RequiresAdmin = true
            };
        }

        /// <summary>
        /// SQL演示相关API配置
        /// 包含SQL查询演示功能的端点
        /// </summary>
        public static class SqlDemo
        {
            /// <summary>
            /// 执行SQL查询API端点
            /// 用于执行SQL查询操作
            /// 需要认证才能访问
            /// </summary>
            public static ApiEndpoint ExecuteQuery => new ApiEndpoint
            {
                Url = "/api/sqldemo/execute",
                Method = HttpMethod.Post,
                Description = "执行SQL查询",
                RequiresAuth = true
            };
        }

        /// <summary>
        /// SQL日志相关API配置
        /// 包含SQL操作日志管理的端点
        /// </summary>
        public static class SqlLog
        {
            /// <summary>
            /// 获取SQL日志API端点
            /// 用于获取SQL执行日志记录
            /// 需要管理员权限
            /// </summary>
            public static ApiEndpoint GetLogs => new ApiEndpoint
            {
                Url = "/api/sqllog/logs",
                Method = HttpMethod.Get,
                Description = "获取SQL执行日志",
                RequiresAuth = true,
                RequiresAdmin = true
            };
        }
    }

    /// <summary>
    /// HTTP请求方法枚举
    /// 定义了支持的HTTP请求方法类型
    /// </summary>
    public enum HttpMethod
    {
        Get,    // GET请求，用于获取资源
        Post,   // POST请求，用于创建资源
        Put,    // PUT请求，用于更新资源
        Delete  // DELETE请求，用于删除资源
    }

    /// <summary>
    /// API端点配置类
    /// 定义了单个API端点的完整配置信息
    /// </summary>
    public class ApiEndpoint
    {
        /// <summary>
        /// API端点的相对路径
        /// 例如："/api/auth/login"
        /// </summary>
        public string Url { get; set; } = "";

        /// <summary>
        /// API端点使用的HTTP方法
        /// 定义了该端点接受的请求类型
        /// </summary>
        public HttpMethod Method { get; set; }

        /// <summary>
        /// API端点的功能描述
        /// 用于文档和调试目的
        /// </summary>
        public string Description { get; set; } = "";

        /// <summary>
        /// 标识该API是否需要用户认证
        /// true表示需要提供有效的认证令牌
        /// </summary>
        public bool RequiresAuth { get; set; }

        /// <summary>
        /// 标识该API是否需要管理员权限
        /// true表示需要管理员级别的访问权限
        /// </summary>
        public bool RequiresAdmin { get; set; }

        /// <summary>
        /// 获取API的完整URL
        /// 将基础URL和相对路径组合成完整的API地址
        /// </summary>
        /// <returns>完整的API URL</returns>
        public string GetFullUrl()
        {
            return $"{ApiConfig.BaseUrl}{Url}";
        }

        /// <summary>
        /// 获取带参数的完整URL
        /// 将URL中的参数占位符替换为实际值
        /// </summary>
        /// <param name="parameters">URL参数字典，键为参数名，值为参数值</param>
        /// <returns>替换参数后的完整URL</returns>
        public string GetFullUrl(Dictionary<string, string> parameters)
        {
            string url = Url;
            if (parameters != null)
            {
                foreach (var param in parameters)
                {
                    url = url.Replace($"{{{param.Key}}}", param.Value);
                }
            }
            return $"{ApiConfig.BaseUrl}{url}";
        }
    }
}